﻿package com.manyiaby.view.viewutils;

import android.content.Context;
import android.text.TextUtils;
import android.view.View;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.widget.ProgressBar;

import com.manyiaby.datautils.DataBizImpl;
import com.manyiaby.datautils.DatasCallback;
import com.manyiaby.model.flexiblemodel.Coupons;
import com.manyiaby.presenter.tokens.TokenPresenter;
import com.manyiaby.presenter.utils.LoginUtil;
import com.manyiaby.view.viewutils.DialogUtil.DialogUtil;
import com.manyiaby.view.viewutils.activityUtil.ActivityUtil;
import com.manyiaby.welcome.ProxyApplication;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.List;

import okhttp3.RequestBody;

/**
 * 帮助WebView处理一些页面控制和请求通知还可以重写很多方法
 */
public class MyWebViewChromeClient extends WebChromeClient {
    private ProgressBar progressBar;
    private Context mContext;

    public MyWebViewChromeClient() {
    }

    public MyWebViewChromeClient(Context context, ProgressBar progressBar) {
        this.mContext = context;
        this.progressBar = progressBar;
    }


    /**
     * 进度条
     *
     * @param view
     * @param newProgress
     */
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        super.onProgressChanged(view, newProgress);
        // Activity的进度范大于或等于100表示页面加载完成
        if (newProgress == 100) {
            if (progressBar != null) {
                progressBar.setVisibility(View.GONE);
            }
        } else {
            if (progressBar != null) {
                if (View.GONE == progressBar.getVisibility()) {
                    progressBar.setVisibility(View.VISIBLE);
                }
                progressBar.setProgress(newProgress);
            }
        }
    }

    /**
     * 弹出警告框
     *
     * @param view
     * @param url
     * @param message
     * @param result
     * @return
     */
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        return super.onJsAlert(view, url, message, result);
    }


    /**
     * 弹出确认框
     *
     * @param view
     * @param url
     * @param message
     * @param result
     * @return
     */
    @Override
    public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
        return super.onJsConfirm(view, url, message, result);
    }

    /**
     * 弹出输入框
     * 通过拦截JS的提示来处理与View的交互
     * prompt("传入进Prompt的参数"，"默认参数")
     * prompt("js约定://NationalDay方法名?title=国庆活动&type=类型2&price=100&n...", "默认参数http://m.manyiaby.com/AppActivity/CeramicsArtworkList?typeId=8&isApp=1&isIos=0");
     *
     * @param view
     * @param url          完全地址:http://manyiaby.com?js://NationlDay？argue=111&arg2=222
     * @param message      传入到输入框的参数   js://NationlDay？argue=111&arg2=222
     * @param defaultValue 默认参数String串
     * @param result       对话框返回值
     * @return
     */
    @Override
    public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
        //function xxxx(){//协议
        //    var result = prompt("js://myw?arg1=111","");//例子
        //    var result = prompt("js://NationalDay", "");//本APP后台约定：js(约定拦截Key),NationalDay(暂无用)，""(传入到Prompat的值对应message)
        //}
        LogUtil.iYx("---JsPrompt:---" + url + "-----传入进Prompt的参数：-----" + message + "----默认参数:-----" + defaultValue);
        try {
            String protocol = getUrlScheme(message);//判断协议，是否是JS
            if (protocol.equals("js")) {//是约定好的Key=js;进行拦截
                LogUtil.iYx("-----Js_Prompt:拦截-----");
                String methodName = getUrlMethodName(message);// 获取方法名
                if ("NationalDay".equals(methodName)) {
                    LogUtil.iYx("----------发布动态------------");
                    gotoSendCircle();
                } else if ("RussiaFestival".equals(methodName)) {
                    LogUtil.iYx("----------查看作品详情------------");
                    gotoWokDetail(message);
                } else if ("ShoppingDay".equals(methodName)) {
                    LogUtil.iYx("----------领取红包------------");
                    gotoGetCoupon(view, message);
                } else if ("artistSpecialShow".equals(methodName)) {
                    LogUtil.iYx("----------艺术家专题------------");
                    gotoArtstSeriess(message);
                } else if ("H5ArtworkList".equals(methodName)) {
                    LogUtil.iYx("----------打开新的H5页面------------");
                    gotoH5NewView(message, defaultValue);
                }
                result.cancel();//点击了取消按钮
                return true;
            }

        } catch (Exception e) {
            LogUtil.iYx("--js-error:--" + e);
            return true;
        }
        LogUtil.iYx("---JsPrompt:放行---");
        return super.onJsPrompt(view, url, message, defaultValue, result);
    }

    /**
     * 给WebView的img标签设置点击事件
     *
     * @param view
     */
    private void addImgClickListener(WebView view) {
        view.loadUrl("javascript:(function(){" +
                "var objs = document.getElementsByTagName(\"img\"); " +
                "for(var i=0;i<objs.length;i++)  " +
                "{"
                + "    objs[i].onclick=function()  " +
                "    {  "
                + "        window.local_obj.showSource(this.src);  " +
                "    }  " +
                "}" +
                "})()");
    }

    /**
     * 重新计算WebView的高度
     *
     * @param view
     */
    private void reWebViewMeasure(WebView view) {
        //这个是一定要加上那个的,配合scrollView和WebView的height=wrap_content属性使用
        //设置setWebViewClient且设置WebView高度为wrap_content防止ScrollView嵌套WebView出现大面积空白问题
        int w = View.MeasureSpec.makeMeasureSpec(0,
                View.MeasureSpec.UNSPECIFIED);
        int h = View.MeasureSpec.makeMeasureSpec(0,
                View.MeasureSpec.UNSPECIFIED);
        //重新测量
        view.measure(w, h);
    }


    /**
     * 获取链接中的参数 arg1
     * "js://myw?arg1=111"
     *
     * @param url
     * @return
     */
    private HashMap<String, String> getUrlParams(String url) {
        int index = url.indexOf("?");
        if (index < 0) {
            return null;
        }
        String argStr = url.substring(index + 1);
        String[] argAry = argStr.split("&");
        HashMap<String, String> argMap = new HashMap<String, String>(argAry.length);
        for (String arg : argAry) {
            System.out.println("arg:" + arg);
            String[] argAryT = arg.split("=");
            argMap.put(argAryT[0], argAryT[1]);
        }
        return argMap;
    }

    /**
     * 获取链接中的协议js
     * "js://myw?arg1=111"
     *
     * @param url
     * @return
     */
    private String getUrlScheme(String url) {
        int index = url.indexOf(":");
        return url.substring(0, index);
    }

    /**
     * 获取Url中的方法名，在判断协议为js协议后进行拦截获取
     * js://myw?arg1=111"
     *
     * @param url
     * @return
     */
    private String getUrlMethodName(String url) {
        //int indexStart = url.indexOf("//");//js:// = Index = 5
        int indexEnd = url.indexOf("?");
        LogUtil.iYx("-----?号下标-------" + indexEnd);
        if (indexEnd < 0) {//在Url中没有？号表示没有参数
            LogUtil.iYx("-----截取到5下标到尾部-------");
            return url.substring(5, url.length());//含头不含尾 4~尾巴
        } else {
            LogUtil.iYx("-----截取到5到？号之间方法-------" + url.substring(5, indexEnd));
            return url.substring(5, indexEnd);//4~？号下标
        }
    }


    public String getPwd(String txt) {
        LogUtil.iYx("Js get pwd...");
        return txt;
    }


    //===============WebView操作↑↑===================跳转及数据请求↓↓============================================

    /**
     * 跳转发布动态
     */
    private void gotoSendCircle() {
        if (ProxyApplication.getInstance().getUserData() != null && ProxyApplication.getInstance().getUserData().getUserId() != null) {
            ActivityUtil.sendCircle(mContext);
        } else {
            LoginUtil.goLogin(mContext);
        }
    }

    /**
     * 跳查看作品详情
     */
    private void gotoWokDetail(String message) {
        HashMap<String, String> argMap = getUrlParams(message);//获取message中的js://NationalDay？argue=111$arg2=222
        if (argMap != null) {
            LogUtil.iYx("------JsPrompt:拦截到有参数-------");
            String arg1 = argMap.get("artworkId");//获取指定Key的参数值，去调用指定的本地方法
            LogUtil.iYx("------art1值是:-----" + arg1);
            //    String res = getPwd(arg1);
            //    //view.loadUrl("javascript:fromCallBack");
            //    //mWebView.loadUrl("javascript:fromCallBack('0','" + getJsonStr(model) + "','" + id + "','" + name + "')");
            //    result.confirm(res);//点击了确认按钮，返回值
            if (!TextUtils.isEmpty(arg1)) {
                ActivityUtil.skipWokDetail(mContext, arg1,false);//跳转作品详情
            }
        }
    }

    /**
     * 跳获取一张优惠劵
     *
     * @param message
     */
    private void gotoGetCoupon(final WebView view, String message) {
        if (ProxyApplication.getInstance().getUserData() == null || ProxyApplication.getInstance().getUserData().getUserId() == null) {
            LoginUtil.goLogin(mContext);
        } else {
            HashMap<String, String> argMap = getUrlParams(message);//获取message中的js://NationalDay？argue=111$arg2=222
            if (argMap != null) {
                LogUtil.iYx("------JsPrompt:拦截到有参数-------");
                final String arg1 = argMap.get("couponId");//获取指定Key的参数值，去调用指定的本地方法
                LogUtil.iYx("------art1值是:-----" + arg1);
                if (!TextUtils.isEmpty(arg1)) {
                    DialogUtil.showLoading(mContext);
                    DataBizImpl bizImpl = new DataBizImpl();
                    JSONObject requests = new JSONObject();
                    try {
                        requests.put("id", arg1);//当id=0是 为一键领取
                        requests.put("activityId", "2");//固定是2
                        RequestBody requestBody = RequestJsonObjectUtils.getJsonObjectUtils().addJsonObject(requests);
                        String tokenkey = "BasicAuth  " + TokenPresenter.TokenKey;
                        bizImpl.setSaveCoupons(tokenkey, requestBody, new DatasCallback<List<Coupons>>() {
                            @Override
                            public void onSuccess(List<Coupons> couponses) {
                                DialogUtil.hidn();
                                LogUtil.iYx("------成功!告诉JS为：1-----");
                                //0成功String url1 = "javascript:getCouponReturn(";
                                //String url2 = arg1;   String url3 = ",1)";
                                view.loadUrl("javascript:getCouponReturn(" + arg1 + ",1)");
                            }

                            @Override
                            public void onFailed(String msg) {
                                DialogUtil.hidn();
                                LogUtil.iYx("------失败!告诉JS为：0-----");
                                view.loadUrl("javascript:getCouponReturn(" + arg1 + ",0)");
                            }
                        });
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }


                }
            }
        }//else

    }

    /**
     * 跳艺术家系列作品
     *
     * @param message
     */
    private void gotoArtstSeriess(String message) {
        HashMap<String, String> argMap = getUrlParams(message);//获取message中的js://NationalDay？argue=111$arg2=222
        if (argMap != null) {
            LogUtil.iYx("------JsPrompt:拦截到有参数-------");
            String arg1 = argMap.get("artistId");//获取指定Key的参数值，去调用指定的本地方法
            LogUtil.iYx("------art1值是:-----" + arg1);
            String arg2 = argMap.get("title");//title=李化猛专场"
            LogUtil.iYx("------art2值是:-----" + arg2);
            String shareTitle = argMap.get("shareTitle") != null ? argMap.get("shareTitle") : "";//分享字段shareTitle, shareImgUrl, shareText, shareUrl
            String shareImgUrl = argMap.get("shareImgUrl") != null ? argMap.get("shareImgUrl") : "";
            String shareText = argMap.get("shareText") != null ? argMap.get("shareText") : "";
            String shareUrl = argMap.get("shareUrl") != null ? argMap.get("shareUrl") : "";
            if (!TextUtils.isEmpty(arg1)) {
                ActivityUtil.gotoArtistSeries(mContext, arg1, arg2, shareTitle, shareImgUrl, shareText, shareUrl);//跳转到李化猛的专题
            }
        }

    }

    /**
     * 打开新H5页面
     *
     * @param message
     * @param defaultUrl
     */
    private void gotoH5NewView(String message, String defaultUrl) {
        HashMap<String, String> argMap = getUrlParams(message);//获取message中的js://NationalDay？argue=111$arg2=222
        if (argMap != null) {
            LogUtil.iYx("------JsPrompt:拦截到有参数-------");
            //获取指定Key的参数值，去调用指定的本地方法
            String arg1 = argMap.get("id") != null ? argMap.get("id") : "";//预留字段ID
            LogUtil.iYx("------art1值是:-----" + arg1);
            String arg2 = argMap.get("title");
            LogUtil.iYx("------arg2值是:-----" + arg2);
            String shareTitle = argMap.get("shareTitle") != null ? argMap.get("shareTitle") : "";//分享字段shareTitle, shareImgUrl, shareText, shareUrl
            String shareImgUrl = argMap.get("shareImgUrl") != null ? argMap.get("shareImgUrl") : "";
            String shareText = argMap.get("shareText") != null ? argMap.get("shareText") : "";
            String shareUrl = argMap.get("shareUrl") != null ? argMap.get("shareUrl") : "";
            ActivityUtil.skipDetailH5Web(mContext, defaultUrl, arg2, shareTitle, shareImgUrl, shareText, shareUrl);

        }
    }


}
